/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.saber.certificacao.utils;

import br.com.saber.certificacao.enums.Papeis;
import br.com.saber.certificacao.modelos.Roles;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Classe utilizada para criptografar password. Não existe como descriptografar, para validar
 * você deve criptografar o password passado e comparar com o password criptografado gravado
 * no banco.
 * Utiliza MD5
 * @author gbvbahia
 */
public class Criptografia {

    private static MessageDigest md = null;

    static {
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(Criptografia.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private Criptografia() {
    }

    private static Papeis getMaxRole(Set<Roles> roles) {
        int roleNumber = 0;
        Papeis toReturn = null;
        for (Roles role : roles) {
            if (roleNumber < role.getPapel().getLevel()) {
                roleNumber = role.getPapel().getLevel();
            }
        }
        for (Papeis papel : Papeis.values()) {
            if (papel.getLevel() == roleNumber) {
                toReturn = papel;
                break;
            }
        }
        return toReturn;
    }

    /**
     * Método utilizado para criptografar password. Não existe como descriptografar, para validar
     * você deve criptografar o password passado e comparar com o password criptografado gravado
     * no banco.
     * Passe o set dos papeis que o usuário possui.
     * @param rawPass
     * @param Set roles
     * @return Retorna o password criptografado.
     */
    public static String encodePassword(String rawPass, Set<Roles> roles) {
        Papeis role = getMaxRole(roles);
        switch (role) {
            case ADMINISTRADOR:
                rawPass += "admSaber";
                return new String(hexCodes(md.digest(rawPass.getBytes())));
            case COORDENADOR:
                rawPass += "cordSaber";
                return new String(hexCodes(md.digest(rawPass.getBytes())));
            case PROFESSOR:
                rawPass += "profSaber";
                return new String(hexCodes(md.digest(rawPass.getBytes())));
            default:
                return new String(hexCodes(md.digest(rawPass.getBytes())));
        }
    }

    private static char[] hexCodes(byte[] text) {
        char[] hexOutput = new char[text.length * 2];
        String hexString;
        for (int i = 0; i < text.length; i++) {
            hexString = "00" + Integer.toHexString(text[i]);
            hexString.toUpperCase().getChars(hexString.length() - 2,
                    hexString.length(), hexOutput, i * 2);
        }
        return hexOutput;
    }

}
